/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vccibernos;

import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.management.timer.Timer;
import persistencia.PersistenciaAlquiler;
import persistencia.PersistenciaArticulo;
import persistencia.PersistenciaCliente;
import persistencia.PersistenciaPromocion;
import persistencia.PersistenciaFactura;

/**
 *
 * @author JAVA
 */
public class GestionAlquiler {

    public static void mostrarAlquileresPendientes(Cliente cliente) {
        List<Alquiler> lista = PersistenciaAlquiler.obtenerListaAlquileres(cliente);
        Iterator it = lista.iterator();
        System.out.println("El cliente tiene " + lista.size() + " alquiler/es pendiente/s");
        while (it.hasNext()) {
            Alquiler a = (Alquiler) it.next();
            System.out.println(a.toString());
        }
    }

    public static void devolverArticulo(Cliente cliente, int codigo) {
        Alquiler alq = PersistenciaAlquiler.obtieneAlquiler(cliente, codigo);
        if (alq != null) {
            Devolucion dev = new Devolucion(new Date(), cliente, alq);
            float recargo = dev.getRecargo();
            //Si tengo recargo modifico el saldo del cliente
            if (recargo != 0) {                
                System.out.println("Recargo descontado automaticamente de su cuenta");
                GestionMovimientos.addMovimiento(cliente, -recargo, "Recargo por alquiler");
                GestionSaldo.recargarSaldo(-recargo, cliente);
                System.out.println("Su saldo actual es de: " + cliente.getSaldo());
                PersistenciaCliente.modificaCliente(10, cliente, Float.toString(cliente.getSaldo()));
            }
            PersistenciaAlquiler.devuelveAlquiler(alq);
            PersistenciaAlquiler.devuelveArticulo(alq.getArticulo());
            
        }
        else{
            System.out.println("El alquiler no corresponde\n Verifique los datos");
        }
    }

    public static void valorarPelicula(int codigo, float valoracion) {
        float nuevaV;
        if (valoracion > 0 && valoracion < 10) {
            Articulo a = PersistenciaArticulo.obtenerArticulo(codigo);
            if (a instanceof Pelicula) {
                Pelicula p = (Pelicula) a;
                nuevaV = (p.getValoracion() + valoracion) / 2;
                p.setValoracion(nuevaV);
            }
            if (a instanceof Juego) {
                Juego j = (Juego) a;
                nuevaV = (j.getValoracion() + valoracion) / 2;
                j.setValoracion(nuevaV);
            }
            if (PersistenciaArticulo.valorarArticulo(a) == 1) {
                System.out.println("Valoracion añadida correctamente");
            }
        } else {
            System.out.println("La valoracion debe estar entre cero y diez");
        }
    }

    public static void mostrarMejores() {
        List<Articulo> lista = PersistenciaArticulo.mostrarMejorValoradas();
        if (lista.isEmpty()) {
            System.out.println("No hay novedades de este año");
        } else {
            Iterator it = lista.iterator();
            while (it.hasNext()) {
                Articulo art = (Articulo) it.next();
                if (art instanceof Pelicula) {
                    Pelicula p = (Pelicula) art;
                    System.out.println(p.toString());
                } else if (art instanceof Juego) {
                    Juego j = (Juego) art;
                    System.out.println(j);
                }
            }
        }
    }

    public static void mostrarArticulosSeleccionadas(List<Alquiler> lista) {
        Iterator it = lista.iterator();
        System.out.println("Articulos seleccionadas: ");
        System.out.println("-------------------------------------------");
        while (it.hasNext()) {
            Alquiler a = (Alquiler) it.next();
            Articulo art = (Articulo) a.getArticulo();
            System.out.println(art.toString());
        }
    }

    public static void mostrarNovedades() {
        List<Articulo> lista = PersistenciaArticulo.mostrarNovedades();
        if (lista.isEmpty()) {
            System.out.println("No hay peliculas de este año");
        } else {
            Iterator it = lista.iterator();
            while (it.hasNext()) {
                Pelicula p = (Pelicula) it.next();
                System.out.println(p.toString());
            }
        }
    }

    public static void AddAlquiler(List<Alquiler> listaAlquileres, int codigo) {
        try {
            Articulo a = PersistenciaArticulo.obtenerArticulo(codigo);
            if (a == null) {
                System.out.println("No existe ningun articulo con dicho id");
            } else if (a.isDisponible()) {
                Date fechaActual = new Date();
                long fecha = fechaActual.getTime() + (a.getTarifa().getDiasAlquiler() - 1) * Timer.ONE_DAY;
                Date fechaDevolucion = new Date(fecha);
                Alquiler alq = new Alquiler(fechaActual, fechaDevolucion, a, a.getTarifa().getPrecioAlquiler());
                listaAlquileres.add(alq);
                PersistenciaArticulo.preseleccionarArticulo(a);
                System.out.println("Articulo añadido correctamente a la lista de alquileres");
            } else {
                System.out.println("El articulo introducido no se encuentra disponible");
            }
        } catch (Exception ex) {
            Logger.getLogger(GestionAlquiler.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void EliminarAlquiler(List<Alquiler> listaAlquileres, int codigo) {
        Articulo a = PersistenciaArticulo.obtenerArticulo(codigo);
        if (a == null) {
            System.out.println("No existe ningun articulo con dicho id");
        }
        Iterator it = listaAlquileres.iterator();
        Alquiler alq = null;
        while (it.hasNext()) {
            alq = (Alquiler) it.next();
            if (alq.getArticulo().equals(a)) {
                it.remove();
                PersistenciaArticulo.deseleccionaArticulo(alq.getArticulo());
            }
        }
        System.out.println("Articulo eliminado correctamente de la lista");
    }

    public static void aplicacionPromocion(Alquiler a, Promocion promo) {
        //Comprueba si la fecha Fin Alquiler coincide con los dias de la Promocion, si no modifica la fecha Fin Alquiler
        if (promo.getDias() != 0) {
            Date fechaActual = a.getFechaFin();
            long fecha = fechaActual.getTime() + (promo.getDias()) * Timer.ONE_DAY;
            Date nuevaFecha = new Date(fecha);
            a.setFechaFin(nuevaFecha);
        }
        //Comprueba si porcentaje de Promocion es > 0, y modifica el Precio de Alquiler
        if (promo.getPorcentaje() != 0) {
            float precio = a.getPrecio();
            a.setPrecio(precio * (1 - promo.getPorcentaje()));
        }

    }

    public static void comprobarPromociones(List<Alquiler> lista) {
        List<Promocion> listaPromociones = PersistenciaPromocion.mostrarPromocionesVigentes();
        for (Alquiler a : lista) {
            if (a.getArticulo() instanceof Pelicula) {
                Pelicula peli = (Pelicula) a.getArticulo();
                for (Promocion promo : listaPromociones) {
                    if (promo.esAño() && peli.getAnyo() == Integer.parseInt(promo.getDescripcionTipo())) {
                        a.getListap().add(promo);
                        aplicacionPromocion(a, promo);
                    }
                    if (promo.esDirector() && peli.getDirector().compareTo(promo.getDescripcionTipo()) == 0) {
                        a.getListap().add(promo);
                        aplicacionPromocion(a, promo);
                    }
                    if (promo.esGenero() && peli.getGenero().compareTo(promo.getDescripcionTipo()) == 0) {
                        a.getListap().add(promo);
                        aplicacionPromocion(a, promo);
                    }
                }
            }
            if (a.getArticulo() instanceof Juego) {
                Juego juego = (Juego) a.getArticulo();
                for (Promocion promo : listaPromociones) {
                    if (promo.esGenero() && juego.getGenero().compareTo(promo.getDescripcionTipo()) == 0) {
                        a.getListap().add(promo);
                        aplicacionPromocion(a, promo);
                    }
                    if (promo.esSoporte() && juego.getSoporte().compareTo(promo.getDescripcionTipo()) == 0) {
                        a.getListap().add(promo);
                        aplicacionPromocion(a, promo);
                    }
                }
            }
        }
    }

    public static void confirmar(Cliente c, List<Alquiler> listaAlquileres) {
        comprobarPromociones(listaAlquileres);
        FacturaAlquiler f = crearFacturaAlquiler(listaAlquileres, c);
        if (c.getSaldo() >= f.getTotal()) {
            f.imprimirFactura();
            PersistenciaFactura.insertarFacturaAlquiler("Alquiler", f);
            System.out.println("Alquiler descontado automaticamente de su cuenta");
            GestionMovimientos.addMovimiento(c, -f.getTotal(), "Alquiler");
            GestionSaldo.recargarSaldo(-f.getTotal(), c);
            System.out.println("Su saldo actual es de: " + c.getSaldo());
            PersistenciaAlquiler.crearAlquiler(c, listaAlquileres);

        } else {
            System.out.println("Su saldo no es suficiente para el alquiler");
            System.out.println("Recargue su cuenta");
            Iterator it = listaAlquileres.iterator();
            while (it.hasNext()) {
                Alquiler alq = (Alquiler) it.next();
                PersistenciaArticulo.deseleccionaArticulo(alq.getArticulo());
                it.remove();
            }

        }
    }

    public static FacturaAlquiler crearFacturaAlquiler(List<Alquiler> listaAlquileres, Cliente cliente) {
        Date d = new Date();
        FacturaAlquiler f = new FacturaAlquiler(cliente, d, listaAlquileres);
        return f;
    }

    public static void busquedaGenero(String genero) {
        List<Articulo> lista = PersistenciaArticulo.obtenerArticulos("genero", genero);
        Iterator it = lista.iterator();
        while (it.hasNext()) {
            Articulo a = (Articulo) it.next();
            System.out.println(a.toString());
        }
    }

    public static void busquedaTitulo(String titulo) {
        List<Articulo> lista = PersistenciaArticulo.obtenerArticulos("titulo", titulo);
        Iterator it = lista.iterator();
        while (it.hasNext()) {
            Articulo a = (Articulo) it.next();
            System.out.println(a.toString());
        }
    }

    public static void busquedaAnyo(int anyo) {
        List<Articulo> lista = PersistenciaArticulo.obtenerArticulos("ano", Integer.toString(anyo));
        Iterator it = lista.iterator();
        while (it.hasNext()) {
            Articulo a = (Articulo) it.next();
            System.out.println(a.toString());
        }
    }

    public static void busquedaDirector(String director) {
        List<Articulo> lista = PersistenciaArticulo.obtenerArticulos("director", director);
        Iterator it = lista.iterator();
        while (it.hasNext()) {
            Articulo a = (Articulo) it.next();
            System.out.println(a.toString());
        }
    }

    public static void busquedaJuegoGenero(String genero) {
        List<Articulo> lista = PersistenciaArticulo.obtenerArticulos("genero", genero);
        Iterator it = lista.iterator();
        while (it.hasNext()) {
            Articulo a = (Articulo) it.next();
            System.out.println(a.toString());
        }
    }

    public static void busquedaJuegoTitulo(String titulo) {
        List<Articulo> lista = PersistenciaArticulo.obtenerArticulos("titulo", titulo);
        Iterator it = lista.iterator();
        while (it.hasNext()) {
            Articulo a = (Articulo) it.next();
            System.out.println(a.toString());
        }
    }

    public static void busquedaJuegoSoporte(String soporte) {
        List<Articulo> lista = PersistenciaArticulo.obtenerArticulos("soporte", soporte);
        Iterator it = lista.iterator();
        while (it.hasNext()) {
            Articulo a = (Articulo) it.next();
            System.out.println(a.toString());
        }
    }
}
